package workgroup.osaka.DirectLink;

import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.net.Uri;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.os.Handler;
import android.util.Log;

public class DirectLinkConnection {

	DirectLinkMainActivity activity;

	//どの接続を今使っているかを表す
	//0 = 未使用 , 1 = WifiDirect , 2 = Bluetooth
	private int Connection;

	//WifiDirect接続のインスタンス
	private WiFiDirect WiFiDirect;
	//Bluetooth接続のインスタンス
	private BluetoothLink BluetoothLink;
	
	//コンストラクタ
	DirectLinkConnection(DirectLinkMainActivity activity){
		this.activity = activity;
		Connection = 0;
	}

	//WifiDirect接続のコネクション
	void WiFiDirectConnection(Uri g_uri){

		//WifiDirect通信の初期化を行う
		//WifiP2pManager作成
		WifiP2pManager	Manager = (WifiP2pManager) this.activity.getSystemService(Context.WIFI_P2P_SERVICE);
		Log.d("コンストラクタ", "WifiP2pManager作成");

		//チャンネル取得
		Channel  Channel = Manager.initialize(this.activity, this.activity.getMainLooper(), null);
		Log.d("コンストラクタ", "チャンネル取得");
		Manager.removeGroup(Channel, null);

		ProgressDialog dialog = new ProgressDialog(this.activity);
		dialog.setIndeterminate(true);
		dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		dialog.setCancelable(false);
		dialog.setTitle("検索中");
		dialog.setMessage("接続可能端末を検索中...");
		dialog.setOnCancelListener(new OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {

			}
		});

		//ダイアログ表示
		dialog.show();

		//3秒間待つ
		new Handler().postDelayed(new FirstDialog(dialog , g_uri) , 3000);
		Log.d("Handler.postDelayed","end");

	}

	//Bluetooth接続のコネクション
	void BluetoothConnection(Uri g_uri){
		Connection = 2;
		BluetoothLink = new BluetoothLink(activity);
		if(g_uri != null){
			BluetoothLink.setUri(g_uri);
		}
	}

	//現在の端末情報を取得するコネクション
	String[] getStatusConnection(){

		//Log.d("getStatusConnection()", "端末情報取得コネクション");
		String[] status = new String[8];

		if(Connection == 1){
			//端末情報を取得する
			status = WiFiDirect.getStatus();
		}else if (Connection == 2){
			//端末情報を取得する
			status = BluetoothLink.getStatus();
		}else{
			//無し
		}
		//端末情報をreturn
		return status;
	}

	//送信処理のコネクション
	void SendConnection(Uri uri){
		Log.d("SendConnection", "送信コネクション");
		Log.d("SendConnection", "Connection = " + Connection);
		if(Connection == 1){
			WiFiDirect.SendPicture(uri);
		}else if (Connection == 2){
			BluetoothLink.SendPicture(uri);
		}else{
			//
		}
	}

	//切断処理のコネクション
	void DisconnectConnection(){
		Log.d("DisconnectConnection", "切断コネクション");
		if(Connection == 1){
			//終了処理
			WiFiDirect.Destroy();
		}else if (Connection == 2){
			//終了処理
			//BluetoothLink.Destroy();
			//終了する
			BluetoothLink.Disconnect();
			//レシーバーを解除する
			BluetoothLink.UnregisterReceiver();
		}else{

		}
	}

	//終了処理のコネクション
	void DestroyConnection(){
		Log.d("DestroyConnection", "終了コネクション");
		if(Connection == 1){
			//終了処理
			WiFiDirect.Destroy();
		}else if (Connection == 2){
			//終了処理
			BluetoothLink.Destroy();
		}else{

		}
	}

	//再開処理のコネクション
	void ResumeConnection() {
		Log.d("ResumeConnection", "再開コネクション");
		if(Connection == 1){
			WiFiDirect.Resume();
		}else if (Connection == 2){
			BluetoothLink.Resume();
		}else{
			//
		}
	}
	
	//再開処理のコネクション
	void StartConnection() {
		Log.d("StartConnection", "再開コネクション");
		if(Connection == 1){
			//WiFiDirect.Start();
		}else if (Connection == 2){
			BluetoothLink.Start();
		}else{
			//
		}
	}
	
	//中断処理のコネクション
	void PauseConnection() {
		Log.d("PauseConnection", "中断コネクション");
		if(Connection == 1){
			//WiFiDirect.Pause();
		}else if (Connection == 2){
			//BluetoothLink.Pause();
		}else{
			//
		}
	}
	
	//中断処理のコネクション
	void StopConnection() {
		Log.d("StopConnection", "中断コネクション");
		if(Connection == 1){
			//WiFiDirect.Stop();
		}else if (Connection == 2){
			BluetoothLink.Stop();
		}else{
			//
		}
	}

	//初回検索時にWiFi Directの接続状態を初期化
	class FirstDialog implements Runnable{
		Dialog dialog1;
		Uri uri;
		FirstDialog(Dialog dialog, Uri g_uri){
			dialog1 = dialog;
			uri = g_uri;
		}

		@Override   public void run() {
			//ダイアログを消去して処理
			if(dialog1.isShowing()){
				Log.d("dialog.isShowing","dialog.cancel?");

				dialog1.cancel();
				Connection = 1;
				WiFiDirect = new WiFiDirect(activity);
				if(uri != null){
					WiFiDirect.setUri(uri);
				}
			}
		}
	}

	//画面遷移無しギャラリーからUri取得・転送
	void setUriConnection(Uri uri){
		Log.d("Connection image","" + uri);
		if(Connection == 1){
			//WiFiDirectにUriをセット
			WiFiDirect.setUri(uri);
		}else if (Connection == 2){
			//BluetoothLinkにUriをセット
			BluetoothLink.setUri(uri);
		}else{
			//無し
		}
	}
}
